/*
 *  Лицензия MIT
 * 
 *  Copyright 2011 Salnikov Aleksey.
 * 
 *  Данная лицензия разрешает, безвозмездно, лицам, получившим копию данного программного обеспечения
 *  и сопутствующей документации (в дальнейшем именуемыми "Программное Обеспечение"),
 *  использовать Программное Обеспечение без ограничений, включая неограниченное право
 *  на использование, копирование, изменение, объединение, публикацию, распространение,
 *  сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам,
 *  которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:
 * 
 *  Вышеупомянутый копирайт и данные условия должны быть включены во все копии или значимые
 *  части данного Программного Обеспечения.
 * 
 *  ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ ЛЮБОГО ВИДА ГАРАНТИЙ,
 *  ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ,
 *  СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И НЕНАРУШЕНИЯ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ
 *  НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ
 *  ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ
 *  С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
 *  ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
 */

package Interfaces;

import CommonTools.Admin;
import CommonTools.Demand;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Vector;

/**
 * Интерфейс сервера для администратора
 *
 * @author Julien Sorel
 */
public interface AdminInterface extends Remote
{
    /**
     * Процедура аутентификации пользователя
     * @param userName имя пользователя
     * @param userPassword пароль пользователя
     * @return объект Admin, который соответствует конкретному администратору, либо null, если
     * вход не произведен
     * @throws RemoteException
     */
    public Admin authenticate(String userName, String userPassword) throws RemoteException;

    /**
     * Процедура возвращает все поступившие заявки
     * @return ArrayList<Demand>
     * @throws RemoteException
     */
    public ArrayList<Demand> getAllDemands() throws RemoteException;

    /**
     * Метод возвращает список всех существующих администраторов
     * @return ArrayList<Admin>
     * @throws RemoteException
     */
    public ArrayList<Admin> getAllAdmins() throws RemoteException;

    /**
     * Функция удаления заявки
     * @param id номер заявки
     * @throws RemoteException
     */
    public void deleteDemand(int id) throws RemoteException;

    /**
     * Процедура добавления нового администратора
     *
     * @param name String
     * @param fam String
     * @param otch String
     * @param login String
     * @param password String
     * @param mail String
     * @param phone String
     * @throws RemoteException
     */
    public void addAdmin(String name, String fam, String otch, String login, String password, int root, String mail, String phone) throws RemoteException;

    /**
     * Функция удаления администратора
     * @param id номер администратора из БД
     */
    public void deleteAdmin(int id) throws RemoteException;

    /**
     * Функция редактирования данных администратора
     *
     * @param id порядковый номер админа (по этому номеру будет идти редактирование в БД)
     * @param name имя
     * @param fam фамилия
     * @param otch отчество
     * @param login логин
     * @param password пароль
     * @param mail адрес электронной почты
     * @param phone телефон
     * @param photo адрес до фотографии
     */
    public void editAdmin(int id,String name, String fam, String otch, String login, String password, int root, String mail, String phone) throws RemoteException;

    /**
     * Процедура редактирования заявки. Добавляет комментарий и исполнителя к заявке
     * @param idDemand int уникальный номер заявки
     * @param idAdmin int уникальный номер администратора
     * @param comment String строка комментария
     */
    public void editDemand(int idDemand, int idAdmin, String comment, String status) throws RemoteException;

    /**
     * Процедура отметки заявки о выполениия
     * @param idDemand int уникальный номер заявки
     * @param idAdmin int уникальный номер администратора, выполнившего заявку
     */
    public void executeDemand(int idDemand, int idAdmin) throws RemoteException;

    /**
     * Функция получения списка заявок с учетом фильтра пользователя
     * @param staus int - статус заявки. Выбирается из класса Constants,
     * и может принимать значения:
     * ALL_DEMANDS - все заявки
     * EXECUTE_DEMANDS - только выполненные заявки
     * NOT_EXECUTE_DEMANDS - только не выполненные заявки
     * @param time int - время поступления заявки. Выбирается из класса Constants
     * и может принимать значения:
     * ALL_TIME_DEMANDS - заявки за все время
     * LAST_WEEK_DEMANDS - заявки за последнюю неделю
     * PERIOD_TIME_DEMANDS - заявки за период времени. Если используется этот параметр, то
     * можно воспользоваться функцией getDemandsByTime()
     * @param admin int - уникальный номер администратора
     * @return ArrayList<Demand> - список заявок, удовлетворяющих условиям
     * @throws RemoteException
     */
    public ArrayList<Demand> getDemandsByFilter(int staus, int time, int admin, String pc) throws RemoteException;

    /**
     * Функция возвращает id последней заявки в системе
     * @return int
     * @throws RemoteException
     */
    public int getStatistic() throws RemoteException;

    /**
     * Функция занимается проверкой, существует ли
     * указанный администратор (а точнее его логин) в БД.
     * Полезно при создании нового администратора
     * @param login String
     * @return
     * @throws RemoteException
     */
    public boolean isAdminThere(String login) throws RemoteException;

    /**
     * Функция для возвращения всех компьютеров, от которых поступали заявки
     * @return Vector
     * @throws RemoteException
     */
    public Vector getComputers() throws RemoteException;

    /**
     * Функция возвращает период автоудаления
     * @return String
     * @throws RemoteException
     */
    public String getAutoDeletePeriod() throws RemoteException;

    /**
     * Процедура устанавливает период автоудаления
     * @throws RemoteException
     */
    public void setAutoDeletePeriod(String period) throws RemoteException;

    /**
     * Процедура производит автоудаление по желанию администратора
     * @throws RemoteException
     */
    public void autoDelete() throws RemoteException;
}